package com.dhz.common.utils;

import org.apache.commons.lang3.StringUtils;

import java.util.Objects;

/**
 * 基础属性校验工具类
 *
 * @author FY
 */
public class Validator {

    /** 邮箱账号校验 */
    public static final String EMAIL_PATTERN = "^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?";
    /** 手机号校验，支持：1[3~8]+ */
    public static final String MOBILE_PHONE_NUMBER_PATTERN = "^0{0,1}(13[0-9]|14[0-9]|15[0-9]|16[0-9]|17[0-9]|18[0-9])[0-9]{8}$";
    /** 座机电话号码验证，支持：010-1xxxxx, (010)1xxxxx, (010)-1xxxxx和后面加上分机号 */
    public static final String PHONE_PATTERN = "^((\\(0[0-9]{2,3}\\)[\\-]?)|(0[0-9]{2,3}\\-)){1}([1-9][0-9]{5,7})(\\-[0-9]{1,4})?$";
    /** 微信号验证 */
    public static final String WEIXIN_PATTERN="^[a-zA-Z][a-zA-Z0-9-_]{5,19}$";
    /** QQ号验证 */
    public static final String QQ_PATTERN="^[1-9][0-9]{5,11}$";
    /** 车牌号验证 */
    public static final String CAR_PLATE_NO = "^[\u4e00-\u9fa5]{1}[A-Z]{1}[A-Z0-9]{5}$";
    /** 省份简称校验 */
    public static final String PROVINCE_ABBR = "津沪渝冀贵辽黑湘皖青鲁新苏赣鄂桂川甘晋蒙陕吉闽琼浙京宁藏粤云豫";

    /**
     * 邮箱校验
     * @param str {String}
     * @return {boolean}
     */
    public static boolean isEmail (String str) {
        return str!=null && str.matches(EMAIL_PATTERN);
    }

    /**
     * 电话号码校验
     * @param str String
     * @return {true|false}
     */
    public static boolean isMobilePhoneNumber(String str) {
        return !(null == str || Objects.equals(str, "") || !str.matches(MOBILE_PHONE_NUMBER_PATTERN));
    }

    /**
     * 固定电话校验
     * 支持格式：区号3-4个数字；号码6-8个数字，第一个不能使0；分机号1-4个数字
     * <ul>
     *     <li>1.区号-号码                : 010-123456</li>
     *     <li>2.(区号)号码               : (010)123456</li>
     *     <li>3.(区号)-号码              : (010)-123456</li>
     *     <li>4.区号-号码-分机号          : 010-123456-1234</li>
     *     <li>5.(区号)号码-分机号         : (010)123456-1234</li>
     *     <li>6.(区号)-号码-分机号        : (010)-123456-1234</li>
     * </ul>
     * @param str 电话号码
     * @return 校验结果
     */
    public static boolean isPhone(String str) {
        return !(null == str || Objects.equals(str, "") || !str.matches(PHONE_PATTERN));
    }

    /**
     * 微信号校验
     * @param str {String} 微信账号
     * @return {true|false}
     */
    public static boolean isWeixinNumber(String str){
        return str!=null && str.matches(WEIXIN_PATTERN);
    }

    /**
     * QQ号验证
     * @param str QQ号码
     * @return {true|false}
     */
    public static boolean isQqNumber(String str){
        return str!=null && str.matches(QQ_PATTERN);
    }

    /**
     * 车牌号校验
     * @param str 车牌号
     * @return 校验结果 {true|false}
     */
    public static boolean isPlateNo(String str) {
        if (StringUtils.isEmpty(str) || !str.matches(CAR_PLATE_NO)) {
            return false;
        }

        // 截取第一个中文字
        return StringUtils.contains(PROVINCE_ABBR, str.charAt(0));
    }

    /**
     * 判断是否是一个有效的ID
     * @param id ID
     * @return {true|false}
     */
    public static boolean isValidId(Object id) {
        if (id == null) return false;
        if (id instanceof Long) {
            return (long)id != 0;
        }
        if (id instanceof Integer) {
            return (int)id != 0;
        }
        return StringUtils.isEmpty(id.toString());
    }

    /**
     * 判断是否是一个有效的ID
     * @param id ID
     * @return {true|false}
     */
    public static boolean isNotValidId(Object id) {
        return !isValidId(id);
    }

    /**
     * 校验包含中文的字符串长度是否在范围内
     * @param str 包含中文的字符串
     * @param minLen 字符串自小长度,如果值为0，则表示允许该字符串为空
     * @param maxLen 字符串做大长度
     * @return 校验结果的boolean值
     */
    public static boolean lenCN(String str, int minLen, int maxLen) {
        int len = StrExtUtils.lenCNAscii(str);
        return len >= minLen && len <=maxLen;
    }

}
